home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Development / Source / stuff / progress.c < prev    next >
C/C++ Source or Header  |  1994-05-03  |  8KB  |  381 lines

  1. #include "stuff.h"
  2. #include <GestaltEqu.h>
  3.  
  4. static long progress;
  5. static Boolean autoquit = true;
  6.  
  7. TEHandle    TEH;
  8. WindowPtr    progressWindow;
  9. Rect        dragRect;
  10. Rect        windowBounds = { 40, 40, 200, 300 };
  11.  
  12. void ChkOsErr(OSErr errcode)
  13.     {
  14.     char errno[9],*p = &errno[sizeof(errno)];
  15.     if (errcode < 0)
  16.         {
  17.         errcode = -errcode;
  18.         while (errcode > 0)
  19.             {
  20.             *--p = errcode%10+'0';
  21.             errcode /= 10;
  22.             }
  23.         *--p = '-';
  24.         *--p = &errno[sizeof(errno)]-p;
  25.         ParamText((void *)p, 0, 0, 0);
  26.         Alert(129, 0);
  27.         ExitToShell();
  28.         }
  29.     }
  30.  
  31. OSErr GotRequiredParams (AppleEvent *theEvent)
  32.     {
  33.     DescType    returnedType;
  34.     long            actualSize;
  35.     OSErr        err;
  36.     
  37.     err = AEGetAttributePtr (theEvent, keyMissedKeywordAttr, typeWildCard, &returnedType, NULL, 0, &actualSize);
  38.     if (err == errAEDescNotFound)
  39.         return noErr;
  40.     else if (err == noErr)
  41.         return errAEEventNotHandled;
  42.     else
  43.         return err;
  44.     }
  45.  
  46. pascal OSErr HandleOapp (AppleEvent *theAppleEvent, AppleEvent *theReply, long refcon)
  47.     {
  48.     autoquit = false;
  49.     return noErr;
  50.     }
  51.  
  52. pascal OSErr HandleOdoc (AppleEvent *theAppleEvent, AppleEvent *theReply, long refcon)
  53.     {
  54.     register OSErr        err;
  55.     AEDescList        docList;
  56.     
  57.     err = AEGetParamDesc (theAppleEvent, keyDirectObject, typeAEList, &docList);
  58.     if (err == noErr) 
  59.         {
  60.         err = GotRequiredParams (theAppleEvent);
  61.         if (err == noErr)
  62.             {
  63.             long            numDocs, i, actualSize;
  64.             Boolean        wasAlias,isFolder;
  65.             OSErr        err;
  66.             AEKeyword    keyword;
  67.             DescType    returnedType;
  68.     
  69.             err = AECountItems (&docList, &numDocs);
  70.             if (err == noErr) 
  71.                 {
  72.                 BeginProcessing ();
  73.                 for (i = 1; i <= numDocs; i++) 
  74.                     {
  75.                     FSSpec curDocFSS;
  76.                     err = AEGetNthPtr (&docList, i, typeFSS, &keyword, &returnedType,
  77.                                 (Ptr) &curDocFSS, sizeof (FSSpec), &actualSize);
  78.                     if (err == noErr) 
  79.                         {
  80.                         err = ResolveAliasFile (&curDocFSS, true, &isFolder, &wasAlias);
  81.                         if (err == noErr) 
  82.                             {
  83.                             if (isFolder) scanfolder(&curDocFSS);
  84.                             else ProcessDoc(&curDocFSS, 0x0);
  85.                             }
  86.                         }
  87.                     }
  88.                 err = noErr;
  89.                 EndProcessing (numDocs);
  90.                 if (autoquit) ExitToShell();
  91.                 }
  92.             }
  93.         (void) AEDisposeDesc (&docList);
  94.         }
  95.         
  96.     return err;
  97.     }
  98.  
  99. pascal OSErr HandlePdoc (AppleEvent *theAppleEvent, AppleEvent *theReply, long refcon)
  100. {
  101.     return errAEEventNotHandled;
  102. }
  103.  
  104. pascal OSErr HandleQuit (AppleEvent *theAppleEvent, AppleEvent *theReply, long refcon)
  105. {
  106.     ExitToShell();
  107.     return noErr;
  108. }
  109.  
  110. pascal OSErr ReturnEventNotHandled (AppleEvent *theAppleEvent, AppleEvent *theReply, long refcon)
  111. {
  112.     return errAEEventNotHandled;
  113. }
  114.  
  115. #define TrapMask 0x0800
  116.  
  117. static short NumToolboxTraps( void )
  118. {
  119.     if (NGetTrapAddress(0xA86E, ToolTrap) ==
  120.             NGetTrapAddress(0xAA6E, ToolTrap))
  121.         return(0x0200);
  122.     else
  123.         return(0x0400);
  124. }
  125.  
  126. static TrapType GetTrapType(short theTrap)
  127. {
  128.  
  129.     if ((theTrap & TrapMask) > 0)
  130.         return(ToolTrap);
  131.     else
  132.         return(OSTrap);
  133.  
  134. }
  135.  
  136. static Boolean TrapAvailable(short theTrap)
  137. {
  138.  
  139.     TrapType    tType;
  140.  
  141.     tType = GetTrapType(theTrap);
  142.     if (tType == ToolTrap)
  143.     theTrap = theTrap & 0x07FF;
  144.     if (theTrap >= NumToolboxTraps())
  145.         theTrap = 0xA89F;
  146.  
  147.     return (NGetTrapAddress(theTrap, tType) !=
  148.             NGetTrapAddress(0xA89F, ToolTrap));
  149. }
  150.  
  151. void main(void)
  152. {
  153.     int major = 5,minor;
  154.     long gestaltAnswer;
  155.     InitMacintosh();
  156.     if (TrapAvailable(0xA1AD))
  157.         {
  158.         Gestalt(gestaltSystemVersion, &gestaltAnswer);
  159.         major = gestaltAnswer>>8;
  160.         minor = gestaltAnswer&255;
  161.         }
  162.     if (major < 7)
  163.         {
  164.         ParamText("\p: System 7 required",0,0,0);
  165.         Alert(129, 0);
  166.         ExitToShell();        
  167.         }
  168.     SetUpMenus();
  169.     SetUpWindow();
  170.  
  171. /* maintain compatibility with non universal headers */
  172. #ifndef NewAEEventHandlerProc
  173. #define NewAEEventHandlerProc(x) x
  174. #endif
  175.  
  176.     AEInstallEventHandler (kCoreEventClass, kAEOpenApplication, NewAEEventHandlerProc(HandleOapp), 0, false);
  177.     AEInstallEventHandler (kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerProc(HandleOdoc), 0, false);
  178.     AEInstallEventHandler (kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerProc(HandlePdoc), 0, false);
  179.     AEInstallEventHandler (kCoreEventClass, kAEQuitApplication, NewAEEventHandlerProc(HandleQuit), 0, false);
  180.     for (;;)
  181.         HandleEvent();
  182. }
  183. /* end main */
  184.  
  185.  
  186.  
  187. MenuHandle    appleMenu, fileMenu, editMenu;
  188.  
  189. enum    {
  190.     appleID = 1,
  191.     fileID,
  192.     editID
  193.     };
  194.  
  195. enum    {
  196.     openItem = 1,
  197.     closeItem,
  198.     quitItem = 4
  199.     };
  200.  
  201. void SetUpMenus(void)
  202. {
  203.     InsertMenu(appleMenu = NewMenu(appleID, "\p\024"), 0);
  204.     InsertMenu(fileMenu = NewMenu(fileID, "\pFile"), 0);
  205.     DrawMenuBar();
  206.     AddResMenu(appleMenu, 'DRVR');
  207.     AppendMenu(fileMenu, "\pQuit/Q");
  208. }
  209. /* end SetUpMenus */
  210.  
  211. void HandleMenu (long mSelect)
  212. {
  213.     int            menuID = HiWord(mSelect);
  214.     int            menuItem = LoWord(mSelect);
  215.     Str255        name;
  216.     GrafPtr        savePort;
  217.     WindowPeek    frontWindow;
  218.     
  219.     switch (menuID)
  220.       {
  221.       case    appleID:
  222.         GetPort(&savePort);
  223.         GetItem(appleMenu, menuItem, name);
  224.         OpenDeskAcc(name);
  225.         SetPort(savePort);
  226.         break;
  227.     
  228.       case    fileID:
  229.         ExitToShell();
  230.         break;
  231.                   
  232.       }
  233. }
  234. /* end HandleMenu */
  235.  
  236.  
  237. void SetUpWindow(void)
  238.  
  239. {
  240.     dragRect = qd.screenBits.bounds;
  241.     
  242.     progressWindow = NewWindow(0L, &windowBounds, "\pprogress", true, noGrowDocProc, (WindowPtr) -1L, true, 0);
  243.     SetPort(progressWindow);
  244.     TEH = TENew(&windowBounds, &windowBounds);
  245. }
  246. /* end SetUpWindow */
  247.  
  248.  
  249. void InitMacintosh(void)
  250.  
  251. {
  252.     MaxApplZone();
  253.     
  254.     InitGraf(&qd.thePort);
  255.     InitFonts();
  256.     FlushEvents(everyEvent, 0);
  257.     InitWindows();
  258.     InitMenus();
  259.     TEInit();
  260.     InitDialogs(0L);
  261.     InitCursor();
  262.  
  263. }
  264. /* end InitMacintosh */
  265.  
  266. void HandleMouseDown (EventRecord    *theEvent)
  267.  
  268. {
  269.     WindowPtr    theWindow;
  270.     int            windowCode = FindWindow (theEvent->where, &theWindow);
  271.     
  272.     switch (windowCode)
  273.       {
  274.       case inSysWindow: 
  275.         SystemClick (theEvent, theWindow);
  276.         break;
  277.         
  278.       case inMenuBar:
  279.         HandleMenu(MenuSelect(theEvent->where));
  280.         break;
  281.         
  282.       case inDrag:
  283.           if (theWindow == progressWindow)
  284.             DragWindow(progressWindow, theEvent->where, &dragRect);
  285.             break;
  286.             
  287.       case inContent:
  288.           if (theWindow == progressWindow)
  289.             {
  290.             if (theWindow != FrontWindow())
  291.               SelectWindow(progressWindow);
  292.             else
  293.               InvalRect(&progressWindow->portRect);
  294.             }
  295.           break;
  296.           
  297.       case inGoAway:
  298.           if (theWindow == progressWindow && 
  299.               TrackGoAway(progressWindow, theEvent->where))
  300.           HideWindow(progressWindow);
  301.             break;
  302.       }
  303. }
  304. /* end HandleMouseDown */
  305.  
  306. void HandleEvent(void)
  307. {
  308.     int            ok;
  309.     EventRecord    theEvent;
  310.  
  311.     HiliteMenu(0);
  312.     SystemTask ();        /* Handle desk accessories */
  313.     
  314.     ok = GetNextEvent (everyEvent, &theEvent);
  315.     if (ok)
  316.       switch (theEvent.what)
  317.         {
  318.         case mouseDown:
  319.             HandleMouseDown(&theEvent);
  320.             break;
  321.             
  322.         case keyDown: 
  323.         case autoKey:
  324.             if ((theEvent.modifiers & cmdKey) != 0)
  325.               {
  326.               HandleMenu(MenuKey((char) (theEvent.message & charCodeMask)));
  327.               }
  328.             break;
  329.             
  330.         case updateEvt:
  331.             {
  332.             Rect upper = progressWindow->portRect;
  333.             Rect lower = progressWindow->portRect;
  334.             upper.bottom = upper.top + 32;
  335.             lower.top = upper.bottom;
  336.             BeginUpdate(progressWindow);
  337.             SetPort(progressWindow);
  338.             EraseRect(&lower);
  339.             upper.right = ((upper.right-upper.left)*progress>>16)+upper.left;
  340.             FillRect(&upper,(void *)&qd.gray);
  341.             upper.left = upper.right;
  342.             upper.right = lower.right;
  343.             FillRect(&upper,(void *)&qd.white);
  344.             TEUpdate(&progressWindow->portRect, TEH);
  345.             EndUpdate(progressWindow);
  346.             break;
  347.             }
  348.         case activateEvt:
  349.             InvalRect(&progressWindow->portRect);
  350.             break;
  351.  
  352.         case kHighLevelEvent:
  353.             AEProcessAppleEvent (&theEvent);
  354.             break;
  355.         }
  356. }
  357. /* end HandleEvent */
  358.  
  359. void    UpdateProgress(long my_progress)
  360.     {
  361.     Rect upper = progressWindow->portRect;
  362.     upper.bottom = upper.top + 32;
  363.     progress += my_progress;
  364.     if (progress > 0x10000L) progress = 0x10000L;
  365.     if (!my_progress) progress = 0;
  366.     InvalRect(&upper);
  367.     HandleEvent();
  368.     }
  369.  
  370. void    UpdateFileName(FSSpec *new)
  371.     {
  372.     Rect upper = progressWindow->portRect;
  373.     Rect lower = progressWindow->portRect;
  374.     upper.bottom = upper.top + 32;
  375.     lower.top = upper.bottom;
  376.     TESetText(&(new->name[1]),new->name[0],TEH);
  377.     InvalRect(&lower);
  378.     HandleEvent();
  379.     }
  380.  
  381.